/**
 * 
 */
package ar.edu.utn.frgp.banco.service.impl;

import java.util.Date;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.CuentaDao;
import ar.edu.utn.frgp.banco.dao.PlazoFijoDao;
import ar.edu.utn.frgp.banco.dao.impl.CuentasDaoImpl;
import ar.edu.utn.frgp.banco.dao.impl.PlazoFijoDaoImpl;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.PlazoFijo;
import ar.edu.utn.frgp.banco.domain.enums.OrigenFondos;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.exceptions.PersonalisedException;
import ar.edu.utn.frgp.banco.exceptions.ServiceException;
import ar.edu.utn.frgp.banco.service.PlazoFijoService;
import ar.edu.utn.frgp.banco.utils.Constantes;
import ar.edu.utn.frgp.banco.utils.Logger;

/**
 * @author PUSDERKIS
 *
 */
public class PlazoFijoServiceImpl implements PlazoFijoService {
	
	private PlazoFijoDao pfijoDao;
	private CuentaDao cuentaDao;
	
	public PlazoFijoServiceImpl(){
		
		cuentaDao = new CuentasDaoImpl();
		if (pfijoDao == null){
			pfijoDao = new PlazoFijoDaoImpl();
		}
	}
	

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.service.PlazoFijoService#crearPlazoFijo(ar.edu.utn.frgp.banco.domain.PlazoFijo, java.lang.String)
	 */
	@Override
	public void crearPlazoFijo(PlazoFijo p, String dni)
			throws ServiceException, PersonalisedException {
		
		Date fechaActual = new Date();
		
		if (p.getId() != null){
			p.setId(null);
		}
		
		p.setFechaAlta(fechaActual);
		
		if (p.getFechaVencimiento() == null){
			throw new PersonalisedException("Debe definir una fecha de cobro.");
		} else if (p.getFechaVencimiento().compareTo(fechaActual) <= 0){
			throw new ServiceException("La fecha de cobro debe ser mayor a la fecha actual.");
		}
		
		if (p.getOrigenPlazo() == OrigenFondos.CUENTA){
			
			Cuenta c = cuentaDao.obtenerCuenta(p.getCuentaOrigen().getNumero());
			
			if (c.getSaldo().doubleValue() + c.getDescubierto().doubleValue() - p.getMonto().doubleValue() < 0){
				throw new ServiceException(Constantes.OPERACION_SALDO_INSUFICIENTE);
			}
		}
		
		
		try{	
			pfijoDao.crearPlazoFijo(p, dni);
		} catch (DataAccessException dae) {
			throw new ServiceException(dae.getError(),dae);
		} catch (PersonalisedException e) {
			throw e;
		}
		
	}

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.service.PlazoFijoService#obtenerHistoricoPlazoFijo(java.lang.String)
	 */
	

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.service.PlazoFijoService#actualizarPlazoFijo(ar.edu.utn.frgp.banco.domain.PlazoFijo, java.lang.Long)
	 */
	
	@Override
	public List<PlazoFijo> plazosFijosPorCliente(String dni)
			throws ServiceException {
		
		List<PlazoFijo> pf = null;
		try {
			 pf = pfijoDao.plazosFijosPorCliente(dni);
		} catch (DataAccessException e) {
			Logger.error("Ocurrio un error en el DAO.");
			throw new ServiceException(e.getError(),e);
		}
		return pf;
	}
	
	@Override
	public void actualizarPlazoFijo(PlazoFijo p, Long id)
			throws ServiceException, PersonalisedException {
		// TODO Auto-generated method stub

	}

}
